.\"
.\" $Id: parse_ranges.3,v 1.1 2000/07/27 16:59:03 alaffin Exp $
.\"
.\" Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
.\"
.\" This program is free software; you can redistribute it and/or modify it
.\" under the terms of version 2 of the GNU General Public License as
.\" published by the Free Software Foundation.
.\"
.\" This program is distributed in the hope that it would be useful, but
.\" WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
.\"
.\" Further, this software is distributed without any warranty that it is
.\" free of the rightful claim of any third person regarding infringement
.\" or the like.  Any license provided herein, whether implied or
.\" otherwise, applies only to this software file.  Patent licenses, if
.\" any, provided herein do not apply to combinations of this program with
.\" other software, or any other product whatsoever.
.\"
.\" You should have received a copy of the GNU General Public License along
.\" with this program; if not, write the Free Software Foundation, Inc.,
.\" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
.\"
.\" Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
.\" Mountain View, CA  94043, or:
.\"
.\" http://www.sgi.com
.\"
.\" For further information regarding this notice, see:
.\"
.\" http://oss.sgi.com/projects/GenInfo/NoticeExplan/
.\"
.TH PARSE_RANGES 3 07/25/2000 "Linux Test Project"
.SH NAME
parse_ranges \- function to parse a string formatted like 'min:max:mult,...'
.SH SYNOPSIS
.nf
int parse_ranges(char *str, int defmin, int defmax, int defmult, int (*parse_func)(), char **rangeptr, char **errptr);
int range_min(char *rbuf, int r);
int range_max(char *rbuf, int r);
int range_mult(char *rbuf, int r);
.fi
.SH DESCRIPTION
parse_ranges() is a function to parse a comma-separated list of range
tokens each having the following form:
.SP
.nf
		num
	or
		min:max[:mult]
.fi

any of the values may be blank (ie. min::mult, :max, etc.) and default
values for missing arguments may be supplied by the caller.

The special first form is short hand for 'num:num'.

After parsing the string, the ranges are put into an array of integers,
which is malloc'd by the routine.  The min, max, and mult entries of each
range can be extracted from the array using the range_min(), range_max(),
and range_mult() functions.

If \fIrange_ptr\fP is not NULL, and parse_ranges() successfully parses the
range string (ie. does not return -1), *range_ptr will point to space
malloc'd by parse_ranges().  The user may free this space by calling free().

parse_ranges() parameters are:
.SP
.TP 1i
\fIstr\fP
The string to parse - assumed to be a comma-separated
list of tokens having the above format.
.TP 1i
\fIdefmin\fP
default value to plug in for min, if it is missing
.TP 1i
\fIdefmax\fP
default value to plug in for max, if it is missing
.TP 1i
\fIdefmult\fP
default value to plug in for mult, if missing
.TP 1i
\fIparse_func\fP
A user-supplied function pointer, which parse_ranges()
can call to parse the min, max, and mult strings.  This
allows for customized number formats.  The function
MUST have the following prototype:
.SP
.nf
	int parse_func(char *str, int *val)
.fi
.SP
The function should return -1 if str cannot be parsed
into an integer, or >= 0 if it was successfully
parsed.  The resulting integer will be stored in
*val.  If parse_func is NULL, parse_ranges will parse
the tokens in a manner consistent with the sscanf %i format.
.TP 1i
\fIrange_ptr\fP
A user-supplied char **, which will be set to point
at malloc'd space which holds the parsed range
values.   If range_ptr is NULL, parse_ranges() just
parses the string.  The data returned in range_ptr
should not be processed directly - use the functions
range_min(), range_max(), and range_mult() to access
data for a given range.
.TP 1i
\fIerrptr\fP
user-supplied char ** which can be set to point to a
static error string.  If errptr is NULL, it is ignored.
.in -1i

.SP
range_min(), range_max(), and range_mult() parameters are:
.SP
.SP
.TP 1i
\fIrbuf\fP
An array of ranges set up by parse_ranges().
.TP 1i
\fIr\fP
The range number to extract information from.  Must be an integer >= 0 and
< the number of ranges returned by parse_ranges().
.in -1i

.SH EXAMPLES
\fC
.ta .25i +.25i +.25i +.25i
.nf
/*
 * simple example to take a list of ranges on the cmdline (in argv[1]), and
 * print a random number from within that range.
 */

#include <stdio.h>

main()
{
	extern int	parse_ranges(), range_min(), range_max(), range_mult();
	extern long	random_range(), random_range_seed();
	int		min, max, mult, nranges;
	char		*ep, *rp;

	random_range_seed(getpid());
	if ((nranges = parse_ranges(argv[1], 0, INT_MAX, 1, NULL, &rp, &ep)) < 0) {
		fprintf(stderr, "parse_ranges() failed:  %s\n", ep);
		exit(1);
	}

	range = random_range(0, nranges-1, 1);
	min = range_min(rp, range);
	max = range_max(rp, range);
	mult = range_mult(rp, range);

	fprintf("%d\\n", random_range(min, max-1, mult));
	exit(0);
}
\fP
.DT
.SH "SEE ALSO"
random_range(3),
random_range_seed(3),
bytes_by_prefix(3).
.SH DIAGNOSTICS
parse_ranges() returns -1 on error or the number of ranges parsed.  No space
will be malloc'd if parse_ranges() fails.  Error
messages are passed back through the errptr parameter.  There are no error
conditions for range_min(), range_max(), or range_mult().
